1. 애플리케이션 실행 및 로딩
- 실행 시작: 애플리케이션을 실행(예: 실행 파일 더블 클릭, 명령어 입력)하면, 운영체제(OS)가 해당 프로세스를 시작하라는 신호를 받습니다.
- 파일 시스템 접근: OS는 디스크에서 실행 파일을 찾고, 파일 크기 및 위치 등 메타데이터를 확인합니다.
- 메모리 할당: OS는 프로그램을 RAM(메인 메모리) 어디에 적재할지 결정하고, 코드, 데이터, 스택, 힙 등 필요한 공간을 할당합니다.
- 로딩: OS는 실행 파일을 디스크에서 읽어와 할당된 메모리에 적재합니다. 이 과정에서 주소를 해석하고, 필요한 공유 라이브러리(DLL, .so 파일 등)도 메모리에 함께 로드합니다.
2. 프로세스 생성 및 초기화
- 프로세스 제어 블록(PCB): OS는 PCB라는 데이터 구조를 생성하여 애플리케이션을 관리합니다. PCB에는 프로세스 ID, 상태, 소유자, 메모리 매핑, 열린 파일 등 다양한 정보가 저장됩니다.
- 주소 공간 설정: OS는 프로세스마다 독립적인 가상 주소 공간을 설정하고, 논리 주소(프로그램에서 사용하는 주소)를 물리 주소(RAM 내 실제 위치)로 매핑합니다. 이 과정은 **MMU(메모리 관리 장치)**가 담당합니다.
- 실행 컨텍스트 초기화: OS는 CPU 레지스터를 초기화하고, 프로그램 카운터를 애플리케이션의 진입점(보통
main함수)으로 설정합니다.
3. 메모리 관리 기법
OS는 여러 가지 메모리 관리 기법을 사용하여 애플리케이션 및 모든 프로세스의 메모리를 효율적으로 관리합니다:
| 기법 | 설명 |
|---|---|
| 연속 할당 | 초기/간단한 OS에서는 각 프로세스에 연속된 하나의 큰 메모리 블록을 할당함. |
| 페이징(Paging) | 메모리를 고정 크기의 페이지로 나눔. OS는 페이지 테이블로 가상 페이지와 물리 프레임을 매핑하여, 비연속적으로 메모리를 할당함. RAM을 효율적으로 사용 가능. |
| 세그멘테이션 | 메모리를 코드, 데이터, 스택 등 가변 크기 세그먼트로 분할. OS가 세그먼트 테이블로 매핑 관리. |
| 스와핑(Swapping) | RAM이 부족할 경우, OS가 비활성화된 프로세스나 페이지를 디스크(스왑 공간)로 이동시켰다가 필요 시 다시 불러옴. |
| 가상 메모리 | 프로세스가 실제 RAM보다 더 많은 메모리를 사용할 수 있도록, 필요 시 데이터를 RAM과 디스크 사이에서 교환함. |
4. 보호 및 격리
- 메모리 보호: OS는 하드웨어(베이스/리미트 레지스터, 페이지 테이블의 권한 비트 등)를 활용해 각 프로세스가 자신에게 할당된 메모리만 접근하도록 보장합니다.
- 권한 레벨: 애플리케이션은 제한된 권한(유저 모드)에서 실행되고, OS 커널만이 하드웨어나 모든 메모리에 직접 접근할 수 있습니다.
5. 실행 중 메모리 관리
- 할당 및 해제: 애플리케이션이 실행 중 추가 메모리가 필요할 때(
malloc,new등), OS는 추가 페이지나 세그먼트를 할당합니다. - 사용 추적: OS는 어떤 메모리 블록이 사용 중인지, 어떤 블록이 비어 있는지 계속 추적하며, 할당/해제 시 내부 테이블을 갱신합니다.
- 단편화 처리: OS는 내부(블록 내 미사용 공간) 및 외부(여러 곳에 흩어진 빈 공간) 단편화를 처리하기 위해 압축(compaction)이나 페이징 등 기법을 사용합니다.
- 스와핑/스래싱: 전체 메모리 요구량이 실제 RAM을 초과하면, OS는 페이지를 디스크로 스와핑합니다. 스와핑이 과도하면(스래싱) 성능 저하가 발생할 수 있습니다.
6. 프로세스 종료 및 정리
- 자원 해제: 애플리케이션이 종료되면, OS는 할당된 모든 메모리를 해제하고, 열린 파일을 닫으며, PCB를 프로세스 목록에서 제거합니다.
- 메모리 반환: 해제된 메모리는 다른 프로세스가 사용할 수 있도록 메모리 풀로 반환됩니다.
7. 애플리케이션과 OS 메모리 관리의 상호작용
- 시스템 콜: 애플리케이션은 메모리 및 기타 자원을 요청할 때(
brk,mmap,VirtualAlloc등) 시스템 콜을 통해 OS에 요청합니다. OS는 요청을 처리하고, 페이지 테이블 및 메모리 맵을 갱신합니다. - API 및 라이브러리: 코드 내 고수준 메모리 관리(
malloc,free, 가비지 컬렉션 등) 역시 궁극적으로 OS의 메커니즘을 기반으로 동작합니다.
8. OS 메모리 관리의 핵심 역할 요약
- 각 프로세스별 메모리 할당 및 추적
- 메모리 보호 및 프로세스 간 격리
- 효율적인 멀티태스킹을 위한 가상 메모리 구현
- 단편화 및 스와핑 처리
- 프로세스 종료 시 자원 정리
이처럼 OS는 복잡한 조율을 통해 애플리케이션이 효율적이고 안전하게 실행될 수 있도록 메모리를 관리합니다.
운영체제(OS)가 애플리케이션 실행 시 RAM과 가상 메모리를 어떻게 사용하는가
1. 물리적 RAM의 사용
- **RAM(주기억장치)**는 빠른 속도의 물리적 메모리로, OS는 애플리케이션의 실행에 필요한 코드와 데이터를 RAM에 적재하여 CPU가 빠르게 접근하고 명령을 실행할 수 있도록 합니다.
- 애플리케이션을 실행하면, OS는 해당 프로그램의 코드와 데이터를 RAM에 로드합니다. RAM 용량이 충분하다면, 실행 중인 애플리케이션의 모든 중요한 부분이 RAM에 상주하여 빠른 성능을 보장합니다.
2. 가상 메모리의 역할
- 가상 메모리는 실제 RAM 용량과 관계없이 각 애플리케이션이 큰 연속된 메모리 공간을 갖는 것처럼 보이게 해주는 기술입니다.
- OS는 하드디스크나 SSD의 일부(이를 페이지 파일 또는 스왑 공간이라고 부름)를 추가적인 메모리처럼 사용합니다.
- 각 애플리케이션은 자신만의 가상 주소 공간을 할당받으며, OS와 **MMU(메모리 관리 장치)**는 이 가상 주소를 실제 RAM 또는 디스크 상의 위치로 매핑해줍니다.
3. 페이징(Paging)과 스와핑(Swapping)
- OS는 메모리를 고정 크기의 **페이지(Page)**로 나눕니다.
- 만약 RAM이 부족하다면, OS는 당장 필요하지 않은 페이지를 RAM에서 디스크(가상 메모리)로 이동(스와핑)시킵니다. 반대로, 애플리케이션이 해당 데이터가 필요해지면 다시 RAM으로 불러오고, 공간이 부족하면 다른 페이지를 내보냅니다.
- 이 과정은 자동으로 이루어지며, 애플리케이션 입장에서는 항상 큰 연속된 메모리 공간을 사용하는 것처럼 보입니다.
4. 장점
- 격리: 각 애플리케이션은 자신만의 주소 공간을 가지므로, 서로의 메모리에 접근할 수 없습니다.
- 효율성: 애플리케이션의 전체 크기가 실제 RAM보다 커도, OS는 필요한 부분만 RAM에 적재하여 효율적으로 메모리를 사용합니다.
- 멀티태스킹: 여러 애플리케이션이 동시에 실행될 수 있으며, 이들의 전체 메모리 요구량이 실제 RAM을 초과해도 운영체제가 관리할 수 있습니다.
5. 성능 고려사항
- RAM은 디스크보다 훨씬 빠릅니다. RAM이 부족해 스와핑이 자주 일어나면, 성능이 크게 저하될 수 있습니다.
- RAM이 많을수록 가상 메모리 의존도가 줄어들어, 여러 애플리케이션을 동시에 실행해도 더 빠르게 동작합니다.
요약:
운영체제는 빠른 접근이 필요한 데이터는 RAM에, 부족할 때는 디스크의 가상 메모리 공간을 활용해 애플리케이션의 메모리를 관리합니다. 페이징, 스와핑, 주소 변환 등의 기술을 통해 각 애플리케이션이 실제 물리 메모리 한계와 상관없이 넓고 안전한 메모리 공간을 사용할 수 있도록 보장합니다.
요약
- 각 애플리케이션은 자신만의 가상 주소 공간을 가짐
- OS가 가상 주소를 실제 RAM 또는 디스크의 위치로 매핑
- RAM이 부족하면 일부 데이터를 디스크로 이동(스와핑)
이런 구조로 OS는 메모리를 효율적이고 안전하게 관리합니다.